<?xml version='1.0' encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html lang="en" xml:lang="en" xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <link href="cpip.css" rel="stylesheet" type="text/css" />
    <title>File: /Users/paulross/dev/linux/linux-3.13/arch/x86/include/asm/string_64.h</title>
  </head>
  <body>
    <h1>File: /Users/paulross/dev/linux/linux-3.13/arch/x86/include/asm/string_64.h</h1>
    <p>Green shading in the line number column
means the source is part of the translation unit, red means it is conditionally excluded.
Highlighted line numbers link to the translation unit page. Highlighted macros link to
the macro page.</p>
    <pre><a name="1" /><span class="True">       1:</span> <span class="f">#</span><span class="n">ifndef</span> <a href="cpu.c_macros_noref.html#_X0FTTV9YODZfU1RSSU5HXzY0X0hfMA__"><span class="b">_ASM_X86_STRING_64_H</span></a>
<a name="2" /><span class="True">       2:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_X0FTTV9YODZfU1RSSU5HXzY0X0hfMA__"><span class="b">_ASM_X86_STRING_64_H</span></a>
<a name="3" /><span class="True">       3:</span> 
<a name="4" /><span class="True">       4:</span> <span class="f">#</span><span class="n">ifdef</span> <a href="cpu.c_macros_ref.html#_X19LRVJORUxfX18w"><span class="b">__KERNEL__</span></a>
<a name="5" /><span class="True">       5:</span> 
<a name="6" /><span class="True">       6:</span> <span class="k">/* Written 2002 by Andi Kleen */</span>
<a name="7" /><span class="True">       7:</span> 
<a name="8" /><span class="True">       8:</span> <span class="k">/* Only used for special circumstances. Stolen from i386/string.h */</span>
<a name="9" /><span class="True">       9:</span> <span class="m">static</span> <a href="cpu.c_macros_ref.html#_X19hbHdheXNfaW5saW5lXzA_"><span class="b">__always_inline</span></a> <span class="m">void</span> <span class="f">*</span><span class="b">__inline_memcpy</span><span class="f">(</span><span class="m">void</span> <span class="f">*</span><span class="b">to</span><span class="f">,</span> <span class="m">const</span> <span class="m">void</span> <span class="f">*</span><span class="b">from</span><span class="f">,</span> <span class="b">size_t</span> <span class="b">n</span><span class="f">)</span>
<a name="10" /><span class="True">      10:</span> <span class="f">{</span>
<a name="11" /><span class="True">      11:</span>     <span class="m">unsigned</span> <span class="m">long</span> <span class="b">d0</span><span class="f">,</span> <span class="b">d1</span><span class="f">,</span> <span class="b">d2</span><span class="f">;</span>
<a name="12" /><span class="True">      12:</span>     <span class="m">asm</span> <span class="m">volatile</span><span class="f">(</span><span class="e">&quot;rep ; movsl\n\t&quot;</span>
<a name="13" /><span class="True">      13:</span>              <span class="e">&quot;testb $2,%b4\n\t&quot;</span>
<a name="14" /><span class="True">      14:</span>              <span class="e">&quot;je 1f\n\t&quot;</span>
<a name="15" /><span class="True">      15:</span>              <span class="e">&quot;movsw\n&quot;</span>
<a name="16" /><span class="True">      16:</span>              <span class="e">&quot;1:\ttestb $1,%b4\n\t&quot;</span>
<a name="17" /><span class="True">      17:</span>              <span class="e">&quot;je 2f\n\t&quot;</span>
<a name="18" /><span class="True">      18:</span>              <span class="e">&quot;movsb\n&quot;</span>
<a name="19" /><span class="True">      19:</span>              <span class="e">&quot;2:&quot;</span>
<a name="20" /><span class="True">      20:</span>              <span class="f">:</span> <span class="e">&quot;=&amp;c&quot;</span> <span class="f">(</span><span class="b">d0</span><span class="f">)</span><span class="f">,</span> <span class="e">&quot;=&amp;D&quot;</span> <span class="f">(</span><span class="b">d1</span><span class="f">)</span><span class="f">,</span> <span class="e">&quot;=&amp;S&quot;</span> <span class="f">(</span><span class="b">d2</span><span class="f">)</span>
<a name="21" /><span class="True">      21:</span>              <span class="f">:</span> <span class="e">&quot;0&quot;</span> <span class="f">(</span><span class="b">n</span> <span class="f">/</span> <span class="c">4</span><span class="f">)</span><span class="f">,</span> <span class="e">&quot;q&quot;</span> <span class="f">(</span><span class="b">n</span><span class="f">)</span><span class="f">,</span> <span class="e">&quot;1&quot;</span> <span class="f">(</span><span class="f">(</span><span class="m">long</span><span class="f">)</span><span class="b">to</span><span class="f">)</span><span class="f">,</span> <span class="e">&quot;2&quot;</span> <span class="f">(</span><span class="f">(</span><span class="m">long</span><span class="f">)</span><span class="b">from</span><span class="f">)</span>
<a name="22" /><span class="True">      22:</span>              <span class="f">:</span> <span class="e">&quot;memory&quot;</span><span class="f">)</span><span class="f">;</span>
<a name="23" /><span class="True">      23:</span>     <span class="m">return</span> <span class="b">to</span><span class="f">;</span>
<a name="24" /><span class="True">      24:</span> <span class="f">}</span>
<a name="25" /><span class="True">      25:</span> 
<a name="26" /><span class="True">      26:</span> <span class="k">/* Even with __builtin_ the compiler may decide to use the out of line</span>
<a name="27" /><span class="True">      27:</span> <span class="k">   function. */</span>
<a name="28" /><span class="True">      28:</span> 
<a name="29" /><span class="True">      29:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_X19IQVZFX0FSQ0hfTUVNQ1BZXzA_"><span class="b">__HAVE_ARCH_MEMCPY</span></a> <span class="c">1</span>
<a name="30" /><span class="True">      30:</span> <span class="f">#</span><span class="n">ifndef</span> <span class="b">CONFIG_KMEMCHECK</span>
<a name="31" /><span class="False">      31:</span> <span class="f">#</span><span class="n">if</span> <span class="f">(</span><a href="cpu.c_macros_ref.html#_X19HTlVDX19fMA__"><span class="b">__GNUC__</span></a> <span class="f">==</span> <span class="c">4</span> <span class="f">&amp;&amp;</span> <span class="b">__GNUC_MINOR__</span> <span class="f">&gt;=</span> <span class="c">3</span><span class="f">)</span> <span class="f">||</span> <a href="cpu.c_macros_ref.html#_X19HTlVDX19fMA__"><span class="b">__GNUC__</span></a> <span class="f">&gt;</span> <span class="c">4</span>
<a name="32" /><span class="False">      32:</span> <span class="m">extern</span> <span class="m">void</span> <span class="f">*</span><a href="cpu.c_macros_ref.html#_bWVtY3B5XzA_"><span class="b">memcpy</span></a><span class="f">(</span><span class="m">void</span> <span class="f">*</span><span class="b">to</span><span class="f">,</span> <span class="m">const</span> <span class="m">void</span> <span class="f">*</span><span class="b">from</span><span class="f">,</span> <span class="b">size_t</span> <span class="b">len</span><span class="f">)</span><span class="f">;</span>
<a name="33" /><span class="True">      33:</span> <span class="f">#</span><span class="n">else</span>
<a name="34" /><span class="True">      34:</span> <span class="m">extern</span> <span class="m">void</span> <span class="f">*</span><span class="b">__memcpy</span><span class="f">(</span><span class="m">void</span> <span class="f">*</span><span class="b">to</span><span class="f">,</span> <span class="m">const</span> <span class="m">void</span> <span class="f">*</span><span class="b">from</span><span class="f">,</span> <span class="b">size_t</span> <span class="b">len</span><span class="f">)</span><span class="f">;</span>
<a name="35" /><span class="True">      35:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_bWVtY3B5XzA_"><span class="b">memcpy</span></a><span class="f">(</span><span class="b">dst</span><span class="f">,</span> <span class="b">src</span><span class="f">,</span> <span class="b">len</span><span class="f">)</span>                    \
<a name="36" /><span class="True">      36:</span> <span class="f">(</span><span class="f">{</span>                                \
<a name="37" /><span class="True">      37:</span>     <span class="b">size_t</span> <span class="b">__len</span> <span class="f">=</span> <span class="f">(</span><span class="b">len</span><span class="f">)</span><span class="f">;</span>                    \
<a name="38" /><span class="True">      38:</span>     <span class="m">void</span> <span class="f">*</span><span class="b">__ret</span><span class="f">;</span>                        \
<a name="39" /><span class="True">      39:</span>     <span class="m">if</span> <span class="f">(</span><span class="b">__builtin_constant_p</span><span class="f">(</span><span class="b">len</span><span class="f">)</span> <span class="f">&amp;&amp;</span> <span class="b">__len</span> <span class="f">&gt;=</span> <span class="c">64</span><span class="f">)</span>        \
<a name="40" /><span class="True">      40:</span>         <span class="b">__ret</span> <span class="f">=</span> <span class="b">__memcpy</span><span class="f">(</span><span class="f">(</span><span class="b">dst</span><span class="f">)</span><span class="f">,</span> <span class="f">(</span><span class="b">src</span><span class="f">)</span><span class="f">,</span> <span class="b">__len</span><span class="f">)</span><span class="f">;</span>        \
<a name="41" /><span class="True">      41:</span>     <span class="m">else</span>                            \
<a name="42" /><span class="True">      42:</span>         <span class="b">__ret</span> <span class="f">=</span> <span class="b">__builtin_memcpy</span><span class="f">(</span><span class="f">(</span><span class="b">dst</span><span class="f">)</span><span class="f">,</span> <span class="f">(</span><span class="b">src</span><span class="f">)</span><span class="f">,</span> <span class="b">__len</span><span class="f">)</span><span class="f">;</span>    \
<a name="43" /><span class="True">      43:</span>     <span class="b">__ret</span><span class="f">;</span>                            \
<a name="44" /><span class="True">      44:</span> <span class="f">}</span><span class="f">)</span>
<a name="45" /><span class="True">      45:</span> <span class="f">#</span><span class="n">endif</span>
<a name="46" /><span class="False">      46:</span> <span class="f">#</span><span class="n">else</span>
<a name="47" /><span class="False">      47:</span> <span class="k">/*</span>
<a name="48" /><span class="False">      48:</span> <span class="k"> * kmemcheck becomes very happy if we use the REP instructions unconditionally,</span>
<a name="49" /><span class="False">      49:</span> <span class="k"> * because it means that we know both memory operands in advance.</span>
<a name="50" /><span class="False">      50:</span> <span class="k"> */</span>
<a name="51" /><span class="False">      51:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_bWVtY3B5XzA_"><span class="b">memcpy</span></a><span class="f">(</span><span class="b">dst</span><span class="f">,</span> <span class="b">src</span><span class="f">,</span> <span class="b">len</span><span class="f">)</span> <span class="b">__inline_memcpy</span><span class="f">(</span><span class="f">(</span><span class="b">dst</span><span class="f">)</span><span class="f">,</span> <span class="f">(</span><span class="b">src</span><span class="f">)</span><span class="f">,</span> <span class="f">(</span><span class="b">len</span><span class="f">)</span><span class="f">)</span>
<a name="52" /><span class="True">      52:</span> <span class="f">#</span><span class="n">endif</span>
<a name="53" /><span class="True">      53:</span> 
<a name="54" /><span class="True">      54:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_X19IQVZFX0FSQ0hfTUVNU0VUXzA_"><span class="b">__HAVE_ARCH_MEMSET</span></a>
<a name="55" /><span class="True">      55:</span> <span class="m">void</span> <span class="f">*</span><span class="b">memset</span><span class="f">(</span><span class="m">void</span> <span class="f">*</span><span class="b">s</span><span class="f">,</span> <span class="m">int</span> <span class="b">c</span><span class="f">,</span> <span class="b">size_t</span> <span class="b">n</span><span class="f">)</span><span class="f">;</span>
<a name="56" /><span class="True">      56:</span> 
<a name="57" /><span class="True">      57:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_X19IQVZFX0FSQ0hfTUVNTU9WRV8w"><span class="b">__HAVE_ARCH_MEMMOVE</span></a>
<a name="58" /><span class="True">      58:</span> <span class="m">void</span> <span class="f">*</span><span class="b">memmove</span><span class="f">(</span><span class="m">void</span> <span class="f">*</span><span class="b">dest</span><span class="f">,</span> <span class="m">const</span> <span class="m">void</span> <span class="f">*</span><span class="b">src</span><span class="f">,</span> <span class="b">size_t</span> <span class="b">count</span><span class="f">)</span><span class="f">;</span>
<a name="59" /><span class="True">      59:</span> 
<a name="60" /><span class="True">      60:</span> <span class="m">int</span> <span class="b">memcmp</span><span class="f">(</span><span class="m">const</span> <span class="m">void</span> <span class="f">*</span><span class="b">cs</span><span class="f">,</span> <span class="m">const</span> <span class="m">void</span> <span class="f">*</span><span class="b">ct</span><span class="f">,</span> <span class="b">size_t</span> <span class="b">count</span><span class="f">)</span><span class="f">;</span>
<a name="61" /><span class="True">      61:</span> <span class="b">size_t</span> <span class="b">strlen</span><span class="f">(</span><span class="m">const</span> <span class="m">char</span> <span class="f">*</span><span class="b">s</span><span class="f">)</span><span class="f">;</span>
<a name="62" /><span class="True">      62:</span> <span class="m">char</span> <span class="f">*</span><span class="b">strcpy</span><span class="f">(</span><span class="m">char</span> <span class="f">*</span><span class="b">dest</span><span class="f">,</span> <span class="m">const</span> <span class="m">char</span> <span class="f">*</span><span class="b">src</span><span class="f">)</span><span class="f">;</span>
<a name="63" /><span class="True">      63:</span> <span class="m">char</span> <span class="f">*</span><span class="b">strcat</span><span class="f">(</span><span class="m">char</span> <span class="f">*</span><span class="b">dest</span><span class="f">,</span> <span class="m">const</span> <span class="m">char</span> <span class="f">*</span><span class="b">src</span><span class="f">)</span><span class="f">;</span>
<a name="64" /><span class="True">      64:</span> <span class="m">int</span> <span class="b">strcmp</span><span class="f">(</span><span class="m">const</span> <span class="m">char</span> <span class="f">*</span><span class="b">cs</span><span class="f">,</span> <span class="m">const</span> <span class="m">char</span> <span class="f">*</span><span class="b">ct</span><span class="f">)</span><span class="f">;</span>
<a name="65" /><span class="True">      65:</span> 
<a name="66" /><span class="True">      66:</span> <span class="f">#</span><span class="n">endif</span> <span class="k">/* __KERNEL__ */</span>
<a name="67" /><span class="True">      67:</span> 
<a name="68" /><span class="True">      68:</span> <span class="f">#</span><span class="n">endif</span> <span class="k">/* _ASM_X86_STRING_64_H */</span>
<a name="69" /><span class="True">      69:</span> </pre>
  </body>
</html>
